package com.yinhe.music.yhmusic.network.request;

import com.yinhe.music.type.person.BaseInfo;
import com.yinhe.music.yhmusic.constants.IConstants;
import com.yinhe.music.yhmusic.instrument.InstrumentBean;
import com.yinhe.music.yhmusic.model.AlbumInfo;
import com.yinhe.music.yhmusic.model.CommentList;
import com.yinhe.music.yhmusic.model.HomeInfo;
import com.yinhe.music.yhmusic.model.LangResp;
import com.yinhe.music.yhmusic.model.LoginInfo;
import com.yinhe.music.yhmusic.model.Music;
import com.yinhe.music.yhmusic.model.MvsInfo;
import com.yinhe.music.yhmusic.model.PayResultInfo;
import com.yinhe.music.yhmusic.model.ProductInfo;
import com.yinhe.music.yhmusic.model.RadioClassify;
import com.yinhe.music.yhmusic.model.RadioListInfo;
import com.yinhe.music.yhmusic.model.SearchInfo;
import com.yinhe.music.yhmusic.model.SingerList;
import com.yinhe.music.yhmusic.model.SongMenuList;
import com.yinhe.music.yhmusic.model.Tags;
import com.yinhe.music.yhmusic.model.UserContent;
import com.yinhe.music.yhmusic.model.UserInfo;
import com.yinhe.music.yhmusic.model.ValidCodeInfo;
import com.yinhe.music.yhmusic.network.response.Response;
import com.yinhe.music.yhmusic.pay.PayInfo;
import com.yinhe.music.yhmusic.personal.model.UpdateInfo;
import com.yinhe.music.yhmusic.personal.model.VipListInfo;
import com.yinhe.music.yhmusic.search.model.BriefSearchInfo;
import com.yinhe.music.yhmusic.search.model.HotSearchInfo;
import com.yinhe.music.yhmusic.share.ShareInfoResponse;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Url;

/**
 * 封装请求的接口
 *
 * @author 何晓华
 */

public interface WebService {

    /**
     * App更新
     */
    @GET("/api/app/update")
    Observable<Response<UpdateInfo>> getAppUpdateInfo();

    /**
     * 2.1歌曲信息
     *
     * @param musicId 歌曲id
     * @return {@link Music}
     */
    @GET("/api/song/{id}")
    Observable<Response<Music>> getMusicInfo(@Path("id") int musicId);

    /**
     * 2.2 新歌列表
     *
     * @return {@link Music}
     */
    @GET("/api/song/new")
    Observable<Response<Music>> getNewSongList();


    /**
     * 2.2播放歌曲
     *
     * @param musicId 歌曲id
     * @param quality 音质类型：string（参数值可选： "SQ"为超高音质，"HQ"为高音质，"Common"为普通音质，可不填）
     * @return {@link Music}
     */
    @GET("/api/song/{id}/play")
    Observable<Response<BaseInfo>> getMusicUrl(@Path("id") int musicId,
                                               @Query("qualityType") String quality);

    /**
     * 2.3 下载歌曲（批量）
     *
     * @param idList  歌曲id列表：list（例如：[id1,id2,id3]）
     * @param quality 音质类型：string（参数值可选： "SQ"为超高音质，"HQ"为高音质，"Common"为普通音质，可不填）
     * @return {@link BaseInfo}
     */
    @GET("/api/song/download")
    Observable<Response<BaseInfo>> batchDownload(@Query("songIdList") String idList,
                                                 @Query("qualityType") String quality);

    /**
     * 2.4 随心听类型
     *
     * @return {@link LangResp}
     */
    @GET("/api/song/classify")
    Observable<Response<LangResp>> getSongClassify();

    /**
     * 2.5 随心听歌曲
     *
     * @return {@link LangResp}
     */
    @GET("/api/song/classify/{id}/song")
    Observable<Response<Music>> getClassifySongs(@Path("id") int classify);

    /**
     * 3.1歌单信息
     *
     * @param id 歌单id
     * @return {@link SongMenuList}
     */
    @GET("/api/songMenu/{id}")
    Observable<Response<SongMenuList>> getSongMenuInfo(@Path("id") int id);

    /**
     * 3.2 歌单列表
     *
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @param type     歌单列表显示方式：string（参数值可选： "recommend"为推荐，"new"为最新）
     * @return {@link SongMenuList}
     */
    @GET("/api/songMenu")
    Observable<Response<SongMenuList>> getSongMenuList(@Query("curPage") int page,
                                                       @Query("pageSize") int pageSize,
                                                       @Query("songMenuSort") String type);

    /**
     * 3.3 歌单中歌曲列表
     *
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @param id       歌单id：int
     * @param songType 歌曲分类{@link IConstants}
     * @return {@link Music}
     */
    @GET("/api/{songType}/{id}/song")
    Observable<Response<Music>> getMusicList(@Path("songType") String songType,
                                             @Path("id") int id,
                                             @Query("curPage") String page,
                                             @Query("pageSize") String pageSize);

    /**
     * 4.1专辑信息
     *
     * @param id 专辑id
     * @return {@link AlbumInfo}
     */
    @GET("/api/album/{id}")
    Observable<Response<AlbumInfo>> getAlbumInfo(@Path("id") int id);

    /**
     * 4.2 专辑列表
     *
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @return {@link AlbumInfo}
     */
    @GET("/api/album")
    Observable<Response<AlbumInfo>> getAlbumList(@Query("curPage") int page,
                                                 @Query("pageSize") int pageSize);

    /**
     * 4.3  专辑中歌曲列表
     *
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @param id       专辑id
     * @return {@link AlbumInfo}
     */
    @GET("/api/album/{id}/song")
    Observable<Response<AlbumInfo>> getAlbumMusic(@Query("curPage") int page,
                                                  @Query("pageSize") int pageSize,
                                                  @Path("id") int id);

    /**
     * 5.1视频信息
     *
     * @param id 视频id
     * @return {@link MvsInfo}
     */
    @GET("/api/movie/{id}")
    Observable<Response<MvsInfo>> getMvInfo(@Path("id") int id);

    /**
     * 5.2视频链接
     *
     * @param movieId 视频id
     * @return {@link Music}
     */
    @GET("/api/movie/playUrl")
    Observable<Response<BaseInfo>> getMvUrl(@Query("movieId") int movieId);

    /**
     * 5.3 视频列表
     *
     * @param page       当前页：int，默认为1
     * @param pageSize   每页显示数：int，默认为10，最大为100
     * @param classifyId 视频列表显示方式
     * @return {@link MvsInfo}
     */
    @GET("/api/movie")
    Observable<Response<MvsInfo>> getMvList(@Query("curPage") int page,
                                            @Query("pageSize") int pageSize,
                                            @Query("movieClassifyId") int classifyId);

    /**
     * 5.4 获取分类
     *
     * @param type 分类类型
     * @return {@link Tags}
     */
    @GET("/api/{type}/classify")
    Observable<Response<Tags>> getTags(@Path("type") String type);

    /**
     * 5.4 视频点赞
     *
     * @param mvId 分类类型
     * @return {@link BaseInfo}
     */
    @POST("/api/user/like/movie/{mvId}")
    Observable<Response<BaseInfo>> mvLike(@Path("mvId") int mvId);

    /**
     * 5.4 视频取消点赞
     *
     * @param mvId 分类类型
     * @return {@link BaseInfo}
     */
    @DELETE("/api/user/like/movie/{mvId}")
    Observable<Response<BaseInfo>> mvUnLike(@Path("mvId") int mvId);

    /**
     * 6.1 歌手信息
     *
     * @param id 歌手id
     * @return {@link SingerList}
     */
    @GET("/api/singer/{id}")
    Observable<Response<SingerList>> getSingerInfo(@Path("id") int id);

    /**
     * 6.2 歌手列表
     *
     * @return {@link SingerList}
     */
    @GET("/api/singer")
    Observable<Response<SingerList>> getSingerList();

    /**
     * 6.3 歌手中专辑列表
     *
     * @param type
     * @param id       专辑id
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @return {@link AlbumInfo}
     */
    @GET("/api/{type}/{id}/album")
    Observable<Response<AlbumInfo>> getSingerAlbum(@Path("type") String type,
                                                   @Path("id") int id,
                                                   @Query("curPage") int page,
                                                   @Query("pageSize") int pageSize);

    /**
     * 6.4 歌手中视频列表
     *
     * @param movieType singer/instrument
     * @param id        视频id
     * @param page      当前页：int，默认为1
     * @param pageSize  每页显示数：int，默认为10，最大为100
     * @return {@link MvsInfo}
     */
    @GET("/api/{type}/{id}/movie")
    Observable<Response<MvsInfo>> getSingerMvs(@Path("type") String movieType,
                                               @Path("id") int id,
                                               @Query("curPage") int page,
                                               @Query("pageSize") int pageSize);

    /**
     * 7.1  电台节目信息
     *
     * @param id 电台节目id
     * @return {@link RadioListInfo.RadioSongs}
     */
    @GET("/api/radioSong/{id}")
    Observable<Response<RadioListInfo.RadioSongs>> getRadioSongInfo(@Path("id") int id);

    /**
     * 7.2电台节目链接
     *
     * @param radioSongId 电台节目id
     * @return {@link BaseInfo}
     */
    @GET("/api/radioSong/playUrl")
    Observable<Response<BaseInfo>> getRadioSongUrl(@Query("radioSongId") int radioSongId);

    /**
     * 乐器列表
     */
    @GET("/api/instrument")
    Observable<Response<InstrumentBean>> getInstrumentList();

    /**
     * 乐器信息
     */
    @GET("/api/instrument/{id}")
    Observable<Response<InstrumentBean.InstrumentListBean>> getInstrumentInfo(@Path("id") int instrumentId);

    /**
     * 8.1  电台信息
     *
     * @param id 电台id
     * @return {@link RadioListInfo}
     */
    @GET("/api/radio/{id}")
    Observable<Response<RadioListInfo>> getRadioInfo(@Path("id") int id);

    /**
     * 8.2  电台列表
     *
     * @param mPageSize       每页数量
     * @param mPage           每页数量
     * @param bannerNum       轮播图数量
     * @param radioClassifyId 电台列表类型
     * @param sort            排序：new/hot
     * @return {@link RadioListInfo}
     */
    @GET("/api/radio")
    Observable<Response<RadioListInfo>> getRadioList(@Query("pageSize") int mPageSize,
                                                     @Query("curPage") int mPage,
                                                     @Query("bannerNum") int bannerNum,
                                                     @Query("radioClassifyId") int radioClassifyId,
                                                     @Query("radioSort") String sort);

    /**
     * 8.3  电台中电台节目列表
     *
     * @param id       电台id
     * @param pageSize 每页数量
     * @param curPage  每页数量
     * @return {@link RadioListInfo.RadioSongs}
     */
    @GET("/api/radio/{id}/radioSong")
    Observable<Response<RadioListInfo>> getRadioSong(@Path("id") int id,
                                                     @Query("pageSize") int pageSize,
                                                     @Query("curPage") int curPage);

    /**
     * 8.4 电台类别列表
     *
     * @param mPageSize 每页数量
     * @param mPage     页数
     * @return 电台分类
     */
    @GET("/api/radio/classify")
    Observable<Response<RadioClassify>> getRadioClassify(@Query("pageSize") int mPageSize,
                                                         @Query("curPage") int mPage);


    /**
     * 9.1 首页推荐轮播
     *
     * @return {@link HomeInfo}
     */
    @GET("/api/recommend/banner")
    Observable<Response<HomeInfo>> getRecommendBanners();

    /**
     * 9.2 首页推荐歌曲
     *
     * @return {@link HomeInfo}
     */
    @GET("/api/recommend/song")
    Observable<Response<HomeInfo>> getRecommendSongs(@Query("curPage") int curPage,
                                                     @Query("pageSize") int pageSize);

    /**
     * 9.3 首页推荐新歌
     *
     * @return {@link HomeInfo}
     */
    @GET("/api/recommend/newSong")
    Observable<Response<HomeInfo>> getRecommendNewSongs(@Query("curPage") int curPage,
                                                        @Query("pageSize") int pageSize);

    /**
     * 9.4 首页推荐歌单
     *
     * @return {@link HomeInfo}
     */
    @GET("/api/recommend/songMenu")
    Observable<Response<HomeInfo>> getRecommendSongMenus(@Query("curPage") int curPage,
                                                         @Query("pageSize") int pageSize);

    /**
     * 9.5 首页推荐MV
     *
     * @return {@link HomeInfo}
     */
    @GET("/api/recommend/movie")
    Observable<Response<HomeInfo>> getRecommendMvs(@Query("curPage") int curPage,
                                                   @Query("pageSize") int pageSize);

    /**
     * 10.1 搜索列表
     *
     * @param page        当前页：int，默认为1
     * @param pageSize    每页显示数：int，默认为10，最大为100
     * @param keyWords    搜索关键词
     * @param messageType 定义搜索信息：list，可选["song","songMenu","album","singer","movie","radio"]
     * @return {@link SearchInfo}
     */
    @GET("/api/search")
    Observable<Response<SearchInfo>> getSearchList(@Query("curPage") int page,
                                                   @Query("pageSize") int pageSize,
                                                   @Query("keyWords") String keyWords,
                                                   @Query("messageType") String messageType);

    /**
     * 10.2 搜索提示
     *
     * @param keyWords 搜索关键词
     * @return {@link BriefSearchInfo}
     */
    @GET("/api/search/tips")
    Observable<Response<BriefSearchInfo>> getSearchTips(@Query("keyWords") String keyWords);

    /**
     * 10.3 热门搜索
     */
    @GET("/api/search/hot")
    Observable<Response<HotSearchInfo>> getHotSearch();

    /**
     * 11.1 已登录用户信息
     *
     * @return {@link UserInfo}
     */
    @GET("api/user")
    Observable<Response<UserInfo>> getUserInfo();

    /**
     * 11.2 已登录用户编辑
     *
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @PUT()
    Observable<Response<BaseInfo>> modifyInfo(@Url String url,
                                              @Field("nickname") String nickName,
                                              @Field("gender") String gender,
                                              @Field("songMenuName") String songMenuName);

    @Multipart
    @PUT
    Observable<ResponseBody> modifyUserImage(@Url String url,
                                             @Part MultipartBody.Part part);

    /**
     * 11.4  第三方登录
     *
     * @return {@link LoginInfo}
     */
    @FormUrlEncoded
    @POST("/api/user/login/thirdParty")
    Observable<Response<LoginInfo>> thirdPartLogin(@Field("unionId") String unionid,
                                                   @Field("platformId") String platformId,
                                                   @Field("platform") String platform,
                                                   @Field("nickname") String nickname,
                                                   @Field("gender") String gender,
                                                   @Field("image") String image);

    /**
     * 11.5 获取验证码
     *
     * @param phone 手机号
     * @param type  register/password 注册或者重设密码
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @POST("/api/user/{type}/validCode")
    Observable<Response<BaseInfo>> getValidCode(@Path("type") String type,
                                                @Field("phone") String phone);

    /**
     * 11.5 检查验证码
     */
    @FormUrlEncoded
    @PUT("/api/user/validCode")
    Observable<Response<ValidCodeInfo>> checkValidCode(@Field("validCode") String validCode,
                                                       @Field("phone") String phone);


    /**
     * 11.6 用户注册/充值密码
     *
     * @param type      register/password
     * @param phone     手机号
     * @param validCode 验证码
     * @param password  密码
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @POST("/api/user/{type}")
    Observable<Response<LoginInfo>> setPassword(@Path("type") String type,
                                                @Field("phone") String phone,
                                                @Field("validCode") String validCode,
                                                @Field("password") String password);


    /**
     * 11.7 用户登录
     *
     * @param phone    手机号
     * @param passWord 密码
     * @return {@link LoginInfo}
     */
    @FormUrlEncoded
    @PUT("/api/user/login")
    Observable<Response<LoginInfo>> login(@Field("phone") String phone,
                                          @Field("password") String passWord);

    /**
     * 11.9 用户登录
     *
     * @param phone    手机号
     * @param passWord 密码
     * @return {@link LoginInfo}
     */
    @FormUrlEncoded
    @POST("/api/user/password")
    Observable<Response<LoginInfo>> resetPassword(@Field("phone") String phone,
                                                  @Field("password") String passWord,
                                                  @Field("validCode") int validCode);

    /**
     * 11.10 用户修改密码
     *
     * @param oldPassword 原密码
     * @param newPassword 新密码
     * @return {@link LoginInfo}
     */
    @FormUrlEncoded
    @PUT("/api/user/password")
    Observable<Response<LoginInfo>> modifyPassword(@Field("oldPassword") String oldPassword,
                                                   @Field("newPassword") String newPassword);

    /**
     * 11.12 记录用户信息
     */
    @PUT("/api/user/record")
    Observable<Response<LoginInfo>> recordUser();

    /**
     * 12.1 用户创建歌单
     *
     * @param songMenuName 歌单名称
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @POST("/api/user/songMenu")
    Observable<Response<BaseInfo>> createUserSongMenu(@Field("songMenuName") String songMenuName);

    /**
     * 12.2 用户删除歌单
     *
     * @param idList 歌单id列表
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @HTTP(method = "DELETE", path = "/api/user/songMenu", hasBody = true)
    Observable<Response<BaseInfo>> deleteUserSongMenu(@Field("songMenuIdList") String idList);

    /**
     * 12.3 获取用户信息
     *
     * @param userId 用户id
     * @return 用户信息
     */
    @GET("/api/user/{id}")
    Observable<Response<UserInfo>> getOtherUserInfo(@Path("id") String userId);

    /**
     * 12.3 用户编辑歌单
     *
     * @param id 歌单id
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @PUT("/api/user/songMenu/{id}")
    Observable<Response<BaseInfo>> modifyUserSongMenu(@Path("id") int id);

    /**
     * 12.4 歌单中添加歌曲
     *
     * @param id         歌单id
     * @param songIdList 歌曲id列表
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @POST("/api/user/songMenu/{id}/song")
    Observable<Response<BaseInfo>> addSongToUserSongMenu(@Path("id") int id,
                                                         @Field("songIdList") String songIdList);

    /**
     * 12.5 移除歌单中歌曲
     *
     * @param id         歌单id
     * @param songIdList 歌曲id列表
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @HTTP(method = "DELETE", path = "/api/user/songMenu/{id}/song", hasBody = true)
    Observable<Response<BaseInfo>> deleteUserSongMenuSong(@Path("id") int id,
                                                          @Field("songIdList") String songIdList);

    /**
     * 12.12 记录用户听歌
     *
     * @param id         歌曲id
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @POST("/api/user/record/song/{id}")
    Observable<Response<BaseInfo>> recordUserSong(@Path("id") int id);

    /**
     * 13.1 批量收藏
     *
     * @param idList      歌单列表
     * @param radioIdList 电台列表
     * @param collectType 批量收藏分类：songMenu\radio
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @POST("/api/user/collect/{type}")
    Observable<Response<BaseInfo>> batchCollection(@Field("songMenuIdList") String idList,
                                                   @Field("radioIdList") String radioIdList,
                                                   @Path("type") String collectType);

    /**
     * 13.2 批量取消收藏
     *
     * @param idList      歌单列表
     * @param radioIdList 电台列表
     * @param collectType 批量收藏分类：songMenu\radio
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @HTTP(method = "DELETE", path = "/api/user/collect/{type}", hasBody = true)
    Observable<Response<BaseInfo>> batchUnCollection(@Field("songMenuIdList") String idList,
                                                     @Field("radioIdList") String radioIdList,
                                                     @Path("type") String collectType);

    /**
     * 13.5 收藏单个
     *
     * @param id          歌手/专辑/视频 id
     * @param collectType singer/album/movie
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @POST("/api/user/collect/{type}/{id}")
    Observable<Response<BaseInfo>> collect(@Path("id") int id,
                                           @Path("type") String collectType);

    /**
     * 13.6 取消单个收藏
     *
     * @param id          歌手/专辑/视频 id
     * @param collectType singer/album/movie
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @DELETE("/api/user/collect/{type}/{id}")
    Observable<Response<BaseInfo>> unCollect(@Path("id") int id,
                                             @Path("type") String collectType);

    /**
     * 获取用户内容
     *
     * @param userId   用户id
     * @param type     用户的歌单/电台 songMenu/radio
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @return {@link SongMenuList}
     */
    @GET("/api/user/{id}/{type}")
    Observable<Response<UserContent>> getUserContent(@Path("id") String userId,
                                                     @Path("type") String type,
                                                     @Query("curPage") int page,
                                                     @Query("pageSize") int pageSize);

    /**
     * 13.13 获取收藏歌手
     */
    @GET("/api/user/collect/singer")
    Observable<Response<SingerList>> getCollectSinger(@Query("curPage") int curPage,
                                                      @Query("pageSize") int pageSize);

    /**
     * 13.13 获取收藏专辑
     */
    @GET("/api/user/collect/album")
    Observable<Response<AlbumInfo>> getCollectAlbum(@Query("curPage") int curPage,
                                                    @Query("pageSize") int pageSize);

    /**
     * 13.13 获取收藏Mv
     */
    @GET("/api/user/collect/movie")
    Observable<Response<MvsInfo>> getCollectMovie(@Query("curPage") int curPage,
                                                  @Query("pageSize") int pageSize);

    /**
     * 13.13 获取收藏Mv
     */
    @GET("/api/user/collect/radio")
    Observable<Response<RadioListInfo>> getMyRadio(@Query("curPage") int curPage,
                                                   @Query("pageSize") int pageSize);

    /**
     * 14.3 购买订单信息
     *
     * @param payType     支付方式：string（可选：alipay[支付宝支付]，wechat[微信支付]，snowGold[雪币支付]，member[会员免费支付]）
     * @param productType 物品类型：string（可选：member[会员]，song[歌曲]，snowGold[雪币]）
     * @param product     物品：购买的会员天数（int）、歌曲id（string）、雪币个数（int）
     * @return
     */
    @FormUrlEncoded
    @POST("/api/user/purchase")
    Observable<Response<PayInfo>> getPayInfo(@Field("payType") String payType,
                                             @Field("productType") String productType,
                                             @Field("product") String product);

    /**
     * 14.2 购买查询
     */
    @GET("/api/user/purchase")
    Observable<Response<ProductInfo>> getProductInfo(@Query("productType") String productType,
                                                     @Query("product") String product);

    /**
     * 14.1 查询支付状态
     *
     * @param orderNo 订单号
     */
    @GET("/api/user/purchase/{orderNo}")
    Observable<Response<PayResultInfo>> getPayResult(@Path("orderNo") String orderNo);

    /**
     * 14.4 已购歌曲列表
     *
     * @return {@link Music}
     */
    @GET("/api/user/purchase/song")
    Observable<Response<Music>> getBoughtMusicList();

    /**
     * 14.5 会员/雪币列表
     *
     * @param type member/snowGold
     */
    @GET("/api/user/purchase/{type}")
    Observable<Response<VipListInfo>> getProductsList(@Path("type") String type);

    /**
     * 15.2 评论列表
     *
     * @param id          歌手/专辑/视频 id
     * @param commentType 评论类型 singer/song/radioSong
     * @param curPage     当前页
     * @param pageSize    每页数量
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @GET("/api/user/comment/{type}/{id}")
    Observable<Response<CommentList>> getCommentList(@Path("id") int id,
                                                     @Path("type") String commentType,
                                                     @Query("curPage") int curPage,
                                                     @Query("pageSize") int pageSize);

    /**
     * 15.3 发表评论
     *
     * @param id          歌手/专辑/视频 id
     * @param commentType 评论类型 singer/song/radioSong
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @FormUrlEncoded
    @POST("/api/user/comment/{type}/{id}")
    Observable<Response<BaseInfo>> comment(@Path("id") int id,
                                           @Path("type") String commentType,
                                           @Field("content") String content);

    /**
     * 16.1 获取分享信息
     *
     * @param id        歌曲、电台歌曲、视频id
     * @param shareType song/radioSong/movie
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    @GET("/api/user/share/{type}/{id}")
    Observable<Response<ShareInfoResponse>> getShareInfo(@Path("id") int id,
                                                         @Path("type") String shareType);

    /**
     * 19.1 用户反馈
     */
    @FormUrlEncoded
    @POST("/api/user/feedback")
    Observable<Response<BaseInfo>> feedBack(@Field("content") String content);
}
